//简单的通知中心

//一个简单的通知对象

//事件数组
var _eventDictionary = {};

/**
 * 注册观察者
 * event 要观察的事件名 
 * callback 处理观察的回调
 * target 要修正的目标
 */
var _observe = function (event, callback, target) {

    var historyEvent = [];
    if (_eventDictionary.hasOwnProperty(event)) {
        historyEvent = _eventDictionary[event];//构造一个新的事件数组
    }

    historyEvent.push(
        {
            callback: callback,
            target: target
        }
    );

    //写回事件数组
    _eventDictionary[event] = historyEvent;
};

/**
 * 通知
 * event 要通知的事件名
 * sender 发送者
 * data 发送的数据
 */
var _notify = function (event, sender, data) {

    for (var eventName in _eventDictionary) {
        //处理事件
        if (eventName === event) {

            var historyEvent = _eventDictionary[event];

            for (var index in historyEvent) {

                var observer = historyEvent[index];
                //如果存在callback
                if (observer && observer.callback) {
                    observer.callback.bind(observer.target || sender)(event, sender, data);
                }
            }
        }
    }
};
/**
 * 广播数据 所有注册的观察者都会接收到数据
 * sender 发送者
 * data 发送的数据
 */
var _boradcast = function (sender, data) {
    for (var eventName in _eventDictionary) {

        var historyEvent = _eventDictionary[eventName];

        for (var index in historyEvent) {

            var observer = historyEvent[index];

            //如果存在callback
            if (observer && observer.callback) {
                observer.callback.bind(observer.target || sender)(eventName, sender, data);
            }
        }
    }
};

/** 
 * 移除观察者 依据event 与回调函数确认
 * event 事件名称
 * callback 回调函数
 */
var _removeObserve = function (event, callback) {
    //确实存在这个event
    if (_eventDictionary.hasOwnProperty(event)) {

        var eventHistory = _eventDictionary[event];

        //临时时间数组
        var tmpEventHistory = [];
        //遍历
        for (var index in eventHistory) {
            var observer = eventHistory[index];

            //确认回调函数一致
            if (observer.callback === callback) {
                cc.log("----命中observer----");
                continue;
            }
            //压入临时数组
            tmpEventHistory.push(observer);
        }

        //更新事件列表
        _eventDictionary[event] = tmpEventHistory;
    }
};

/**
 * 移除所有观察者 根据event
 * event 事件名称
 */
var _removeEventObserves = function (event) {
    if (_eventDictionary.hasOwnProperty(event)) {
        delete _eventDictionary[event];
    }
};
/**
 * 移除说有观察者
 */
var _removeAllObserves =  function () {
    _eventDictionary={};
}




//导出这个模块
module.exports = {
    notify: _notify,
    observe: _observe,
    boradcast: _boradcast,
    removeObserve:_removeObserve,
    removeEventObserves:_removeEventObserves,
    removeAllObserves:_removeAllObserves
};
